package com.gjy.redis.util.scan;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.ScanParams;
import redis.clients.jedis.ScanResult;

import java.util.HashMap;
import java.util.Map;

/**
 * 高效遍历大型 Hash（常用场景：用户属性、计数表）。
 *
 * @author gjy
 * @version 1.0
 * @since 2025-10-13 16:07:11
 */
public class HScanUtil {

    /**
     * 完整遍历一个 Hash，返回所有 field→value。
     *
     * @param jedis   Jedis 实例
     * @param key     Hash 键名
     * @param pattern 对 field 进行 MATCH（可为 null）
     * @param count   每次返回的期望字段数
     */
    public static Map<String, String> hScanAll(Jedis jedis,
                                               String key,
                                               String pattern,
                                               int count) {
        Map<String, String> result = new HashMap<>();
        String cursor = ScanParams.SCAN_POINTER_START;

        ScanParams params = new ScanParams().count(count);
        if (pattern != null && !pattern.isEmpty()) {
            params.match(pattern);
        }

        while (!cursor.equals(ScanParams.SCAN_POINTER_START) || result.isEmpty()) {
            ScanResult<Map.Entry<String, String>> rs = jedis.hscan(key, cursor, params);
            for (Map.Entry<String, String> entry : rs.getResult()) {
                result.put(entry.getKey(), entry.getValue());
            }
            cursor = rs.getCursor();
        }
        return result;
    }

}
